package pe.edu.sistemas.sisdiho.mappers;

import java.sql.Time;
import java.util.Collection;
import java.util.List;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Update;

import pe.edu.sistemas.sisdiho.entities.HorarioClase;

public interface HorarioClaseMapper {
	@Select ("select idhorario_clase as idHorarioClase,"
			+ "hora_inicio as horaInicio,"
			+ "hora_fin as horaFin,"
			+ "grupo_idgrupo as idGrupo,"
			+ "aula as aula,"
			+ "dia as dia,"
			+ "docente_iddocente as idDocente,"
			+ "horario_clase_tipo as horarioClaseTipo,"
			+ "horario_clase_periodo as horarioClasePeriodo "
			+ "from HORARIO_CLASE")
	List<HorarioClase> obtenerHorariosClase();
	
	@Select ("select idhorario_clase as idHorarioClase,"
			+ "hora_inicio as horaInicio,"
			+ "hora_fin as horaFin,"
			+ "grupo_idgrupo as idGrupo,"
			+ "aula as aula,"
			+ "dia as dia,"
			+ "docente_iddocente as idDocente,"
			+ "horario_clase_tipo as horarioClaseTipo,"
			+ "horario_clase_periodo as horarioClasePeriodo "
			+ "from HORARIO_CLASE "
			+ "where horario_clase_periodo = #{periodo} "
			+ "and dia = #{dia} ")
	List<HorarioClase> obtenerHorariosClasexPeriodoyDia(@Param("periodo") String periodo, @Param("dia") int dia);
	
	@Select ("select idhorario_clase as idHorarioClase,"
			+ "hora_inicio as horaInicio,"
			+ "hora_fin as horaFin,"
			+ "grupo_idgrupo as idGrupo,"
			+ "aula as aula,"
			+ "dia as dia,"
			+ "docente_iddocente as idDocente,"
			+ "horario_clase_tipo as horarioClaseTipo,"
			+ "horario_clase_periodo as horarioClasePeriodo "
			+ "from HORARIO_CLASE "
			+ "where horario_clase_periodo = #{periodo} "
			+ "and dia = #{dia} "
			+ "and #{hInicio} <= hora_inicio "
			+ "and hora_fin <= #{hFin}")
	List<HorarioClase> obtenerHorariosClasexPeriodoxDiayHora(@Param("periodo") String periodo, @Param("dia") int dia,
															 @Param("hInicio") String hInicio, @Param("hFin") String hFin);

	@Select ("select DISTINCT idhorario_clase as idHorarioClase,"
			+ "h.hora_inicio as horaInicio,"
			+ "h.hora_fin as horaFin,"
			+ "h.grupo_idgrupo as idGrupo,"
			+ "h.aula as aula,"
			+ "h.dia as dia,"
			+ "h.docente_iddocente as idDocente,"
			+ "h.horario_clase_tipo as horarioClaseTipo,"
			+ "h.horario_clase_periodo as horarioClasePeriodo "
			+ "from HORARIO_CLASE h,GRUPO g,CURSO_PERIODO cp,CURSO_CONJUNTO cc,CURSO_BASE cb,PLAN "
			+ "where h.horario_clase_periodo = #{periodo} "
			+ "and h.dia = #{dia} "
			+ "and h.docente_iddocente = #{idDocente} "
			+ "and h.GRUPO_IDGRUPO=g.IDGRUPO "
			+ "and g.CURSO_IDCURSO = cp.IDCURSO_PERIODO "
			+ "and cp.CURSO_PERIODO_CURSOC_CODCOMUN=cc.CURSOC_CODCOMUN "
			+ "and cc.CURSOC_IDCURSO_GENERAL=cb.IDCURSO_GENERAL "
			+ "and cb.PLAN_ID_PLAN = PLAN.IDPLAN "
			+ "and PLAN.ESCUELA_IDESCUELA = #{idEscuela}")	
	public List<HorarioClase> obtenerHorariosxDiaxDocentexPeriodoxEscuela( @Param("dia") int dia,@Param("idDocente")int idDocente,@Param("periodo") String periodo,@Param("idEscuela") int idEscuela);
	
	@Select ("select idhorario_clase as idHorarioClase,"
			+ "hora_inicio as horaInicio,"
			+ "hora_fin as horaFin,"
			+ "grupo_idgrupo as idGrupo,"
			+ "aula as aula,"
			+ "dia as dia,"
			+ "docente_iddocente as idDocente,"
			+ "horario_clase_tipo as horarioClaseTipo,"
			+ "horario_clase_periodo as horarioClasePeriodo "
			+ "from HORARIO_CLASE "
			+ "where horario_clase_periodo = #{periodo} "
			+ "and dia = #{dia} "
			+ "and docente_iddocente = #{idDocente} ")
	public List<HorarioClase> obtenerHorariosxDiaxDocentexPeriodo( @Param("dia") int dia,@Param("idDocente")int idDocente,@Param("periodo") String periodo);

	@Select ("select idhorario_clase as idHorarioClase,"
			+ "hora_inicio as horaInicio,"
			+ "hora_fin as horaFin,"
			+ "grupo_idgrupo as idGrupo,"
			+ "aula as aula,"
			+ "dia as dia,"
			+ "docente_iddocente as idDocente,"
			+ "horario_clase_tipo as horarioClaseTipo,"
			+ "horario_clase_periodo as horarioClasePeriodo "
			+ "from HORARIO_CLASE "
			+ "where grupo_idgrupo = #{grupoId} ")
	public List<HorarioClase> obtenerHorariosxGrupo( @Param("grupoId") int grupoId);

	@Select ("select idhorario_clase as idHorarioClase,"
			+ "hora_inicio as horaInicio,"
			+ "hora_fin as horaFin,"
			+ "grupo_idgrupo as idGrupo,"
			+ "aula as aula,"
			+ "dia as dia,"
			+ "docente_iddocente as idDocente,"
			+ "horario_clase_tipo as horarioClaseTipo,"
			+ "horario_clase_periodo as horarioClasePeriodo "
			+ "from HORARIO_CLASE "
			+ "where grupo_idgrupo = #{idGrupo} "
			+ "and horario_clase_periodo = #{periodo} ")
	public List<HorarioClase> obtenerHorariosxGrupoxPeriodo(@Param("idGrupo") int idGrupo,
																@Param("periodo") String periodo);
	
	@Insert ("insert into HORARIO_CLASE "
			+ "(GRUPO_IDGRUPO, HORARIO_CLASE_TIPO, DIA, DOCENTE_IDDOCENTE, HORA_INICIO, HORA_FIN, HORARIO_CLASE_PERIODO, AULA, IDHORARIO_CLASE ) "
			+ "VALUES "
			+ "( #{idGrupo}, #{tipoClase}, #{dia}, #{idDocente}, #{horaInicio}, #{horaFin}, #{periodoNombre}, #{aula}, NULL )")
	void crearNuevoHorario(@Param("idGrupo") int idGrupo,@Param("tipoClase") String tipoClase,@Param("dia") int dia,@Param("idDocente") int idDocente,@Param("horaInicio") String horaInicio,@Param("horaFin") String horaFin,@Param("periodoNombre") String periodoNombre, @Param("aula") String aula);
	
	@Select("select idhorario_clase as idHorarioClase,"
			+ "hora_inicio as horaInicio," + "hora_fin as horaFin,"
			+ "grupo_idgrupo as idGrupo," + "aula as aula," + "dia as dia,"
			+ "docente_iddocente as idDocente,"
			+ "horario_clase_tipo as horarioClaseTipo,"
			+ "horario_clase_periodo as horarioClasePeriodo "
			+ " from HORARIO_CLASE "
			+ "WHERE ((`hora_inicio` <=  #{hInicio} AND  `hora_fin` > #{hInicio}) "
			+ "OR (`hora_inicio` <  #{hFin} AND  `hora_fin` >=  #{hFin})) "
			+ "AND `dia`=#{dia} AND `horario_clase_periodo`=#{periodo}"
			+ "AND docente_iddocente=#{idDocente}")
	public List<HorarioClase> obtenerHorariosCrucexDiaxDocentexPeriodo(
			@Param("idDocente") int idDocente, @Param("dia") int dia,
			@Param("hInicio") Time hInicio, @Param("hFin") Time hFin,
			@Param("periodo") String periodo);
	
	@Delete("delete from HORARIO_CLASE WHERE idhorario_clase = #{idHorario}")
	void eliminarHorario(@Param("idHorario") int idHorario);	
	
	@Select ("select DISTINCT idhorario_clase as idHorarioClase,"
			+ "h.hora_inicio as horaInicio,"
			+ "h.hora_fin as horaFin,"
			+ "h.grupo_idgrupo as idGrupo,"
			+ "h.aula as aula,"
			+ "h.dia as dia,"
			+ "h.docente_iddocente as idDocente,"
			+ "h.horario_clase_tipo as horarioClaseTipo,"
			+ "h.horario_clase_periodo as horarioClasePeriodo "
			+ "from HORARIO_CLASE h,GRUPO g,CURSO_PERIODO cp,CURSO_CONJUNTO cc,CURSO_BASE cb,PLAN "
			+ "where h.horario_clase_periodo = #{periodo} "
			+ "and h.docente_iddocente = #{idDocente} "
			+ "and h.GRUPO_IDGRUPO=g.IDGRUPO "
			+ "and g.CURSO_IDCURSO = cp.IDCURSO_PERIODO "
			+ "and cp.CURSO_PERIODO_CURSOC_CODCOMUN=cc.CURSOC_CODCOMUN "
			+ "and cc.CURSOC_IDCURSO_GENERAL=cb.IDCURSO_GENERAL "
			+ "and cb.PLAN_ID_PLAN = PLAN.IDPLAN "
			+ "and PLAN.ESCUELA_IDESCUELA = #{idEscuela} "
			+ "ORDER BY h.dia")	
	public List<HorarioClase> obtenerHorariosOrdenadosxDiaxDocentexEscuelaxPeriodo(@Param("idDocente")int idDocente,@Param("idEscuela")int idEscuela,@Param("periodo") String periodo );
	
	
	@Update("update HORARIO_CLASE "
			+ "SET HORA_INICIO = #{hInicio}, "
			+ "HORA_FIN = #{hFin}, "
			+ "DIA = #{dia}, "
			+ "AULA = #{aula}, "
			+ "DOCENTE_IDDOCENTE = #{idDocente}, "
			+ "HORARIO_CLASE_TIPO = #{horarioClaseTipo} "
			+ "WHERE IDHORARIO_CLASE = #{idHorarioClase}")
	void modificarHorario(@Param("idHorarioClase") int idHorarioClase,@Param("hInicio") String hInicio,@Param("hFin") String hFin,
			@Param("dia") int dia, @Param("idDocente") int idDocente, @Param("horarioClaseTipo") String horarioClaseTipo,
			@Param("aula") String aula);
	
	@Select ("select idhorario_clase as idHorarioClase,"
			+ "hora_inicio as horaInicio,"
			+ "hora_fin as horaFin,"
			+ "grupo_idgrupo as idGrupo,"
			+ "aula as aula,"
			+ "dia as dia,"
			+ "docente_iddocente as idDocente,"
			+ "horario_clase_tipo as horarioClaseTipo,"
			+ "horario_clase_periodo as horarioClasePeriodo "
			+ "from HORARIO_CLASE "
			+ "where idhorario_clase = #{idHorarioClase} ")
	public HorarioClase obtenerHoraroxIdHorario( @Param("idHorarioClase") int idHorarioClase);

	@Select ("select idhorario_clase as idHorarioClase,"
			+ "hora_inicio as horaInicio,"
			+ "hora_fin as horaFin,"
			+ "grupo_idgrupo as idGrupo,"
			+ "aula as aula,"
			+ "dia as dia,"
			+ "docente_iddocente as idDocente,"
			+ "horario_clase_tipo as horarioClaseTipo,"
			+ "horario_clase_periodo as horarioClasePeriodo "
			+ "from HORARIO_CLASE "
			+ "where grupo_idgrupo = #{idGrupo} "
			+ "AND dia = #{dia} "
			+ "AND horario_clase_periodo = #{periodo}")
	public List<HorarioClase> obtenerHorariosxGrupoxPeriodoxDia(@Param("idGrupo") int idGrupo, @Param("dia") int dia, @Param("periodo") String periodo);
}